package beans;

import entidades.Processo;
import entidades.Usuario;
import java.io.NotSerializableException;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.model.StreamedContent;
import rn.AnexoProcessoRN;
import rn.ProcessoRN;
import rn.VolumeProcessoRN;
import util.ContextoUtil;
import util.FacesUtil;
import util.RelatorioUtil;
import entidades.AnexoProcesso;
import entidades.VolumeProcesso;

/**
 *
 * @author Marcelo Neto
 */
@ManagedBean(name="filtroBean")
@ViewScoped
public class FiltroBean implements Serializable 
{
    private static final long serialVersionUID = -4680525146258770622L;
    private final String CAMINHO_BRASAO = FacesUtil.getServletContext().getRealPath("/resources/imagens/brasao.jpg");
    private final String CAMINHO_LOGO = FacesUtil.getServletContext().getRealPath("/resources/imagens/logo_gaprj.jpg");
    private List<Processo> listarProcessoPorStatus;
    private List<VolumeProcesso> listarVolumesPorStatus;
    private List<AnexoProcesso> listarAnexosPorStatus;
    private Integer filtroSelecionado;
    private Integer relacaoSelecionada;
    private StreamedContent arquivoRetorno;
    //private StreamedContent arquivoRetornoPAG;
    private int tipoRelatorio;  
    private Date dataIni;
    private Date dataFim;
    private Date dataIniRelacao;
    private Date dataFimRelacao;
    //private Date dataAtual = new Date(System.currentTimeMillis());
    
    @SuppressWarnings("unchecked")
    public StreamedContent getArquivoRetorno() throws NotSerializableException, Exception
    {
        try 
        {
            ContextoBean contextoBean = ContextoUtil.getContextoBean();
            Usuario usuario = contextoBean.getUsuarioLogado();
            String usu = usuario.getLogin();
            String nomeRelatorioJasper = "";
            String nomeRelatorioSaida = "";
            
            // Gerar relação de processos
            if(this.relacaoSelecionada == 1) {
                nomeRelatorioJasper = "Relacao1";
                nomeRelatorioSaida = usu + "_Relacao1";
            }
            // Gerar relação de volumes
            if(this.relacaoSelecionada == 2) {
                nomeRelatorioJasper = "Relacao2";
                nomeRelatorioSaida = usu + "_Relacao2";
            }
            // Gerar relação de anexos
            if(this.relacaoSelecionada == 3) {
                nomeRelatorioJasper = "Relacao3";
                nomeRelatorioSaida = usu + "_Relacao3";
            }

            RelatorioUtil relatorioUtil = new RelatorioUtil();
            HashMap parametrosRelatorio = new HashMap();
            parametrosRelatorio.put("data_ini", this.dataIniRelacao);
            parametrosRelatorio.put("data_fim", this.dataFimRelacao);
            parametrosRelatorio.put("caminho_brasao", CAMINHO_BRASAO);
            parametrosRelatorio.put("caminho_logo", CAMINHO_LOGO);
            this.setArquivoRetorno(relatorioUtil.geraRelatorio(parametrosRelatorio, nomeRelatorioJasper, nomeRelatorioSaida, this.tipoRelatorio));
	} 
        catch (Exception e) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível gerar o relatório!", ""));
	} 
	return this.arquivoRetorno;
    }

    public void setArquivoRetorno(StreamedContent arquivoRetorno) {
        this.arquivoRetorno = arquivoRetorno;
    }
    
    public String imprimir() 
    {
        this.setRelacaoSelecionada(this.relacaoSelecionada);
        this.setDataIniRelacao(this.dataIniRelacao);
        this.setDataFimRelacao(this.dataFimRelacao);

        if(this.relacaoSelecionada == -1 || this.relacaoSelecionada == null) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "É necessário escolher o tipo de relação!", ""));
            return null;
        }
        if(this.dataIniRelacao.after(this.dataFimRelacao)) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "A data inicial deve ser menor que a data final!", ""));
            return null;
        }
        if(this.dataIniRelacao == null || this.dataFimRelacao == null) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "É necessário informar o período!", ""));
            return null;
        }
        return null;
    }

    public void buscar() 
    {
        try 
        {
            if(this.filtroSelecionado != null || this.filtroSelecionado != -1)
            {
                this.setDataIni(this.dataIni);
                this.setDataFim(this.dataFim);
            
                if (this.dataIni.after(this.dataFim)) {
                    FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "A data inicial deve ser menor que a data final!", ""));
                }
                else 
                {
                    ProcessoRN processoRN = new ProcessoRN();
                    VolumeProcessoRN volumeProcessoRN = new VolumeProcessoRN();
                    AnexoProcessoRN anexoProcessoRN = new AnexoProcessoRN();
                    this.setListarProcessoPorStatus(processoRN.listarProcessoPorPeriodo(dataIni, dataFim, this.filtroSelecionado));
                    this.setListarVolumesPorStatus(volumeProcessoRN.listarVolumesPorPeriodo(dataIni, dataFim, filtroSelecionado));
                    this.setListarAnexosPorStatus(anexoProcessoRN.listarAnexosPorPeriodo(dataIni, dataFim, filtroSelecionado));
                }
            }
            else {
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "É necessário filtrar o status do processo!", ""));
            }
        }
        catch(Exception ex) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Um erro inesperado ocorreu! Não foi possível gerar a listagem", ex.getMessage()));
        }
    }

    public String limpar()
    {
        this.setFiltroSelecionado(this.filtroSelecionado);
        this.setDataIni(this.dataIni);
        this.setDataFim(this.dataFim);
        return null;
    }
    
    public String limparRelacao()
    {
        this.setRelacaoSelecionada(this.relacaoSelecionada);
        this.setDataIniRelacao(this.dataIniRelacao);
        this.setDataFimRelacao(this.dataFimRelacao);
        return null;
    }
        
    public List<Processo> getListarProcessoPorStatus() 
    {
        ProcessoRN processoRN = new ProcessoRN();
        if (this.filtroSelecionado != null) {
            this.setListarProcessoPorStatus(processoRN.listarProcessoPorStatus(this.filtroSelecionado));
        }
        if (this.filtroSelecionado != null && this.dataIni != null && this.dataFim != null) {
            this.setListarProcessoPorStatus(processoRN.listarProcessoPorPeriodo(dataIni, dataFim, filtroSelecionado));
        }
        return listarProcessoPorStatus;
    }

    public void setListarProcessoPorStatus(List<Processo> listarProcessoPorStatus) {
        this.listarProcessoPorStatus = listarProcessoPorStatus;
    }

    public List<VolumeProcesso> getListarVolumesPorStatus() 
    {
        VolumeProcessoRN volumeProcessoRN = new VolumeProcessoRN();
        if (this.filtroSelecionado != null) {
            this.setListarVolumesPorStatus(volumeProcessoRN.listarVolumesPorStatus(this.filtroSelecionado));
        }
        if (this.filtroSelecionado != null && this.dataIni != null && this.dataFim != null) {
            this.setListarVolumesPorStatus(volumeProcessoRN.listarVolumesPorPeriodo(dataIni, dataFim, filtroSelecionado));
        }
        return listarVolumesPorStatus;
    }

    public void setListarVolumesPorStatus(List<VolumeProcesso> listarVolumesPorStatus) {
        this.listarVolumesPorStatus = listarVolumesPorStatus;
    }

    public List<AnexoProcesso> getListarAnexosPorStatus() 
    {
        AnexoProcessoRN anexoProcessoRN = new AnexoProcessoRN();
        if (this.filtroSelecionado != null) {
            this.setListarAnexosPorStatus(anexoProcessoRN.listarAnexosPorStatus(this.filtroSelecionado));
        }
        if (this.filtroSelecionado != null && this.dataIni != null && this.dataFim != null) {
            this.setListarAnexosPorStatus(anexoProcessoRN.listarAnexosPorPeriodo(dataIni, dataFim, filtroSelecionado));
        }
        return listarAnexosPorStatus;
    }

    public void setListarAnexosPorStatus(List<AnexoProcesso> listarAnexosPorStatus) {
        this.listarAnexosPorStatus = listarAnexosPorStatus;
    }

    public Integer getFiltroSelecionado() {
        return filtroSelecionado;
    }

    public void setFiltroSelecionado(Integer filtroSelecionado) {
        this.filtroSelecionado = filtroSelecionado;
    }

    public Date getDataIni() {
        return dataIni;
    }

    public void setDataIni(Date dataIni) {
        this.dataIni = dataIni;
    }

    public Date getDataFim() {
        return dataFim;
    }

    public void setDataFim(Date dataFim) {
        this.dataFim = dataFim;
    }
    
    public int getTipoRelatorio() {
        return tipoRelatorio;
    }

    public void setTipoRelatorio(int tipoRelatorio) {
        this.tipoRelatorio = tipoRelatorio;
    }

    public Integer getRelacaoSelecionada() {
        return relacaoSelecionada;
    }

    public void setRelacaoSelecionada(Integer relacaoSelecionada) {
        this.relacaoSelecionada = relacaoSelecionada;
    }

    public Date getDataIniRelacao() {
        return dataIniRelacao;
    }

    public void setDataIniRelacao(Date dataIniRelacao) {
        this.dataIniRelacao = dataIniRelacao;
    }

    public Date getDataFimRelacao() {
        return dataFimRelacao;
    }

    public void setDataFimRelacao(Date dataFimRelacao) {
        this.dataFimRelacao = dataFimRelacao;
    }
}